// Copyright (c) Microsoft
// All rights reserved
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT.
// See the Apache Version 2.0 License for specific language governing permissions and limitations under the License.
/// <tags>P2</tags>
/// <summary>Recursive application of restriction modifiers in function scope </summary>

#include <amptest.h>

void f(int &flag) __GPU
{
    class c
    {
    public:
        void f(int &flag)
        {
            class c2
            {
            public:
                void f(int &flag)
                {
                    class c3
                    {
                    public:
                        void f(int &flag)
                        {

                            class c4
                            {
                            public:
                                void f(int &flag)
                                {
                                    class c5
                                    {
                                    public:
                                        void f(int &flag)
                                        {
                                            class c6
                                            {
                                            public:
                                                void f(int &flag)
                                                {
                                                    flag = 1;
                                                }
                                            };

                                            c6 o;

                                            o.f(flag);

                                        }
                                    };

                                    c5 o;

                                    o.f(flag);

                                }
                            };

                            c4 o;

                            o.f(flag);
                        }
                    };

                    c3 o;

                    o.f(flag);

                }
            };

            c2 o;

            o.f(flag);
        }
    };

    c o;

    o.f(flag);
}

bool test() __GPU
{
    int flag = 0;

    bool passed = true;

    f(flag);

    if (flag != 1)
    {
        return false;
    }

    return passed;
}

int main(int argc, char **argv)
{
    return test() ? 0 : 1;
}

